/********************************************************************************
  * @file     SD93F115B_gpio.c   						    	
  * @author   TEST TEAM 												    	
  * @version  v0															    	
  * @date     Septemper 2022												    	
  * @brief
  *
  * Copyright (C) 2022  Hangzhou SDIC Microelectronics Co., Ltd
**********************************************************************************/

/* Includes */

  #include "SD93F115B_gpio.h"

  #include "SD93F115B_rcc.h"


/*---------------------------------------------------------------------
  * @brief  Deinitializes the GPIO peripheral registers to their default reset values.
  * @param  
  * @retval None
  * 
-----------------------------------------------------------------------*/
void GPIO_DeInit(void)
{
  RCC_APBPeriphResetCmd(RCC_APBPeriph_GPIO, ENABLE);
  RCC_APBPeriphResetCmd(RCC_APBPeriph_GPIO, DISABLE);
}
/*-----------------------------
 * 函数功能：GPIO初始化
 * 入口参数：GPIOx,GPIO_InitStruct
 *           GPIOx: where x can be (0..8) to select the GPIO peripheral.
 * 			 GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains
 *           the configuration information for the specified GPIO peripheral.
 * @note     The configured pins can be: GPIO_Pin_0 to GPIO_Pin_7 for GPIO1..GPIO7,
 *           GPIO_Pin_0 to GPIO_Pin_6 for GPIO0, GPIO_Pin_0 to GPIO_Pin_3 for GPIO8.
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------*/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
	uint8_t pinpos = 0x00;
	
	/* Check the parameters */
	
	assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
	assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
	assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
	assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));	
	assert_param(IS_GPIO_CURRENT(GPIO_InitStruct->GPIO_PTSR));
	
	pinpos=GPIO_InitStruct->GPIO_Pin;
	
	if(IS_GPIO_LIST_PERIPH(GPIOx))
	{
		if(GPIO_InitStruct->GPIO_Mode==GPIO_Mode_AN)
		{
			GPIOx->ADR|=pinpos;
			return;
		}
		else 	
			GPIOx->ADR&=~pinpos;
	}	
	if(GPIO_InitStruct->GPIO_Mode==GPIO_Mode_IN)	
		GPIOx->SETR &=~pinpos;
	else
		GPIOx->SETR|=pinpos;
	
	if(GPIO_InitStruct->GPIO_PuPd==GPIO_PuPd_NOPULL)		
		GPIOx->PUR &=~pinpos;
	else
		GPIOx->PUR|=pinpos;
	
	if(GPIO_InitStruct->GPIO_PTSR==GPIO_PTSR_WEAK)		
		GPIOx->DSR &=~pinpos;
	else
		GPIOx->DSR|=pinpos;
} 

/*--------------------------------------------
 * 函数功能：GPIO初始化配置范例
 * 入口参数：GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure which will 
 *           be initialized.
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)
{
  /* Reset GPIO init structure parameters values */
  GPIO_InitStruct->GPIO_Pin  = GPIO_Pin_All;
  GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStruct->GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStruct->GPIO_PTSR = GPIO_PTSR_WEAK;
  
}

/*--------------------------------------------
 * 函数功能：读取GPIO口某一个pin的输入数据
 * 入口参数：GPIOx,GPIO_Pin
 * 			 GPIOx: where x can be (0..8) to select the GPIO peripheral.
 *           GPIO_Pin: GPIO_Pin_0 to GPIO_Pin_7 for GPIO1..GPIO7,
 *           GPIO_Pin_0 to GPIO_Pin_6 for GPIO0, GPIO_Pin_0 to GPIO_Pin_3 for GPIO8.
 * 出口参数：None
 * 返回值  ：bitstatus
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/    
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin)
{	
	uint8_t bitstatus = 0x00;  
	/* Check the parameters */
	assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
	assert_param(IS_GET_GPIO_PIN(GPIO_Pin));
	
	if ((GPIOx->IDR & GPIO_Pin) != (uint8_t)Bit_RESET)
	{
		bitstatus = Bit_SET;
	}
	else
	{
		bitstatus = Bit_RESET;
	}
	return bitstatus; 	 
} 

 /*--------------------------------------------
 * 函数功能：读取GPIO输入数据
 * 入口参数：GPIOx: where x can be (0..8) to select the GPIO peripheral.
 * 出口参数：None
 * 返回值  ：GPIO输入数据
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/
uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
{	
	/* Check the parameters */
	assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
	
	return ((uint8_t)GPIOx->IDR);	
}  

/*--------------------------------------------
 * 函数功能：读取GPIO口某一个pin的输出数据
 * 入口参数：GPIOx，GPIO_Pin
 *           GPIOx: where x can be (0, ..8) to select the GPIO peripheral.
 * 			 GPIO_Pin：Specifies the port bit to read.
 * @note     This parameter can be GPIO_Pin_x where x can be:(0..7) for GPIO1.. 
 *           GPIO7 ,(0..6) for GPIO0 and(0..3) for GPIO8.
 * 出口参数：None
 * 返回值  ：bitstatus
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin)
{
  uint8_t bitstatus = 0x00;

  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GET_GPIO_PIN(GPIO_Pin));

  if ((GPIOx->ODR & GPIO_Pin) != (uint8_t)Bit_RESET)
  {
    bitstatus = (uint8_t)Bit_SET;
  }
  else
  {
    bitstatus = (uint8_t)Bit_RESET;
  }
  return bitstatus;
}

/*--------------------------------------------
 * 函数功能：读取GPIO的输出数据
 * 入口参数：GPIOx: where x can be (0..8) to select the GPIO peripheral.
 * 出口参数：None
 * 返回值  ：GPIO的输出数据
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/
uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  return ((uint8_t)GPIOx->ODR);
}  
 /*--------------------------------------------
 * 函数功能：配置输出端口某一位的数据
 * 入口参数：GPIOx,GPIO_Pin,BitVal
 *           GPIOx: where x can be (0..8) to select the GPIO peripheral.
 *           GPIO_Pin: specifies the port bit to be written.
 *           BitVal: specifies the value to be written to the selected bit.
 *   @note   The GPIO_Pin parameter can be GPIO_Pin_x where x can be: (0..7) for GPIO1.. 
 *           GPIO8,(0..6) for GPIO0 and(0..3) for GPIO8.  
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/
void GPIO_WriteOutputDataBit(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin,BitAction BitVal)
{
	/* Check the parameters */
	assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
	assert_param(IS_GET_GPIO_PIN(GPIO_Pin));
    assert_param(IS_BIT_ACTION(BitVal));
	
  if (BitVal != Bit_RESET)
  {
    GPIOx->ODR |= GPIO_Pin;
  }
  else
  {
    GPIOx->ODR &=~ GPIO_Pin;
  }	
}

/*--------------------------------------------
 * 函数功能：配置输出端口的数据
 * 入口参数：GPIOx,PortVal
 * 			 GPIOx: where x can be (0..8) to select the GPIO peripheral.
 *           PortVal: specifies the value to be written to the port output data register.
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/
void GPIO_WriteOutputData(GPIO_TypeDef* GPIOx, uint8_t PortVal)
{
	/* Check the parameters */
	assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
	
	GPIOx->ODR = PortVal;
}  



/*-----------------------------------------------------------   
 * 函数功能：使能对应模拟口(A0~A7)下拉到ACM上
 * 入口参数：Ax,NewState
 *			 Ax: A0~A7、AIAll
 *           NewState： ENABLE,DISEBLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------------------------*/ 
void GPIO_AIPuPdCmd(uint8_t Ax,FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	assert_param(IS_Analog_PIN(Ax));
	
	if (NewState != DISABLE)
	{  
		if(Ax!=AIAll)
			GPIO_ASACMR |= ((uint32_t)0x01)<<Ax;
		else
			GPIO_ASACMR |=AIAll;			
	}
	else
	{
		if(Ax!=AIAll)
			GPIO_ASACMR &=~((uint32_t)0x01<<Ax);
		else
			GPIO_ASACMR &=~(uint32_t)AIAll;
	}	
}    

/*----------------------------------------------------   
 * 函数功能：使能VBG从A4输出
 * 入口参数：NewState： ENABLE,DISEBLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------------------*/ 
void GPIO_VBGOutputCmd(FunctionalState NewState)                                          
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	if (NewState != DISABLE)
	{
		GPIO_ASACMR |= GPIO_ASACMR_BGM1EN;
	}
	else
	{
		GPIO_ASACMR &=~GPIO_ASACMR_BGM1EN;
	}	
}
 
/*----------------------------------------------------   
 * 函数功能：使能VBGF从A5输出
 * 入口参数：NewState： ENABLE,DISEBLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------------------*/ 
void GPIO_VBGFOutputCmd(FunctionalState NewState)                                         
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	if (NewState != DISABLE)
	{
		GPIO_ASACMR |= GPIO_ASACMR_BGM2EN;
	}
	else
	{
		GPIO_ASACMR &=~GPIO_ASACMR_BGM2EN;
	}
}  

/*------------------------------------------------------------   
 * 函数功能：使能IOUTP从Ax(A0~A5)输出
 * 入口参数：Ax,NewState
 *           Ax: A0~A5
 *           NewState： ENABLE,DISEBLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------------------*/ 
void GPIO_IOUTPPortCmd(uint8_t Ax,FunctionalState NewState)                             
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	assert_param(IS_Analog_PIN(Ax));
	
	if (NewState != DISABLE)
	{
		GPIO_ASIOUTR |=((uint32_t)0x01)<<Ax*2;	
	}
	else
	{
		GPIO_ASIOUTR &=~((uint32_t)0x01<<Ax*2);
	}
}  

/*-------------------------------------------------------------   
 * 函数功能：使能IOUTN从Ax(A0~A5)输出
 * 入口参数：Ax,NewState
 *           Ax: A0~A5
 *           NewState： ENABLE,DISEBLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------------------*/ 
void GPIO_IOUTNPortCmd(uint8_t Ax,FunctionalState NewState)                                 
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	assert_param(IS_Analog_PIN(Ax));
	
	if (NewState != DISABLE)
	{
		GPIO_ASIOUTR |=((uint32_t)0x01)<<(Ax*2+1);	
	}
	else
	{
		GPIO_ASIOUTR &=~((uint32_t)0x01<<(Ax*2+1));
	}
}                           

/****************************END OF FILE****************************/